﻿''' <summary>
''' Diese KI wird von einem anderen Computer aus gesteuert.
''' </summary>
''' <remarks></remarks>
Public Class KIPassivNetzwerk
    Inherits ObjektKI
    Public BefehleLocker As New Mutex
    Public Befehle As New List(Of KINetzwerkBefehl)
    Public DoesOrder As Boolean = False

    Public Sub New(ByVal Spieler As ObjektSpieler)
        MyBase.New(Spieler, 0, 0, 0, Besetzungsprioritaeten.Keine, GeldTPAngriffsModus.Beides, 0, 0, 0, 0)
    End Sub
    Public Overrides Sub KISchleife()
        BefehleLocker.Lock()
        Hauptmenue.NetzVorratsBefehleLocker.Lock() 'Alle Befehle die Vorraetig angelegt wurden, werden uebernommen
        Dim NewBefehle As New List(Of KINetzwerkBefehl)
        Dim I As Integer = 0
        While Hauptmenue.NetzVorratsBefehle.Count > 0 And I < Hauptmenue.NetzVorratsBefehle.Count
            If Hauptmenue.NetzVorratsBefehle(I).Spieler = Spieler.Spieler Then
                NewBefehle.Add(Hauptmenue.NetzVorratsBefehle(I))
                I += 1
            ElseIf Hauptmenue.NetzVorratsBefehle(I).Spieler = 0 Then
                NewBefehle.Add(Hauptmenue.NetzVorratsBefehle(I))
                I += 1
            Else
                Exit While
            End If
        End While
        Hauptmenue.NetzVorratsBefehle.RemoveRange(0, I)
        For I = 0 To Befehle.Count - 1
            NewBefehle.Add(Befehle(I))
        Next

        Befehle = NewBefehle
        Hauptmenue.NetzVorratsBefehleLocker.Unlock()
        BefehleLocker.Unlock()
        While Schleife = False Or Befehle.Count > 0
            If Befehle.Count > 0 And Not KIKonsolenPause Then
                DoesOrder = True
                'Nur wenn der letzte Befehl auch fertig bearbeitet wurde.
                Dim AktuellerBefehl As KINetzwerkBefehl
                BefehleLocker.Lock()
                AktuellerBefehl = Befehle(0)
                BefehleLocker.Unlock()
                If AktuellerBefehl.sinfoOrder Then
                    sInfoOrder(AktuellerBefehl.sinfo)
                Else
                    AngreiferSchaden = AktuellerBefehl.AngreiferSchaden
                    VerteidigerSchaden = AktuellerBefehl.Verteidigerschaden
                    'hier sollten wir auswaehlen und zwar Gabe,Gebaeudebefehle,Beenden werden nicht ausgefuehrt
                    Select Case AktuellerBefehl.Befehl
                        Case KIModiExtern.Schlachtwechseln
                            Schlachtwechsel(EinheitenSortierKriterien.Zufall)
                            KIWarten(8)
                        Case KIModiExtern.GabeEinsetzen
                            Objektverwalter.Spielfeld.AktuellerSpieler.KOS(0).Gabe()
                            KIWarten(8)
                        Case KIModiExtern.SpezialgabeEinsetzen
                            Objektverwalter.Spielfeld.AktuellerSpieler.KOS(0).Spezialgabe()
                            KIWarten(8)
                        Case KIModiExtern.DoppelGabeEinsetzen
                            Objektverwalter.Spielfeld.AktuellerSpieler.KOS(0).Doppelgabe()
                            KIWarten(8)
                        Case KIModiExtern.RundenEnde
                            Schleife = True
                        Case KIModiExtern.Wechsel
                            Schleife = True
                            RundenEndeMitWechsel = True
                            Spieler.Wechsel()
                        Case KIModiExtern.EinheitBauen
                            GebaeudeAuswaehlen(AktuellerBefehl.Befehl, Objektverwalter.Spielfeld.Landschaften(AktuellerBefehl.KooX, AktuellerBefehl.KooY, Objektverwalter.Spielfeld.MomentaneSchlacht).Gebaeude, _
                                             GenereateUnit(AktuellerBefehl.OpferX, AktuellerBefehl.OpferY, AktuellerBefehl.WegX(0), AktuellerBefehl.Spieler, AktuellerBefehl.WegY(0)), 0)
                        Case KIModiExtern.FabrikBauen
                            GebaeudeAuswaehlen(AktuellerBefehl.Befehl, Objektverwalter.Spielfeld.Landschaften(AktuellerBefehl.KooX, AktuellerBefehl.KooY, Objektverwalter.Spielfeld.MomentaneSchlacht).Gebaeude, _
                                            GenereateUnit(AktuellerBefehl.OpferX, AktuellerBefehl.OpferY, AktuellerBefehl.WegX(0), AktuellerBefehl.Spieler, AktuellerBefehl.WegY(0)), 0)
                        Case KIModiExtern.OmegaRaketeStarten
                            GebaeudeAuswaehlen(AktuellerBefehl.Befehl, Objektverwalter.Spielfeld.Landschaften(AktuellerBefehl.KooX, AktuellerBefehl.KooY, Objektverwalter.Spielfeld.MomentaneSchlacht).Gebaeude, New EinheitAmphibienpanzer(AktuellerBefehl.Spieler, AktuellerBefehl.OpferX, AktuellerBefehl.OpferY), 2)
                        Case KIModiExtern.OmegaUpgradeKaufen
                            GebaeudeAuswaehlen(AktuellerBefehl.Befehl, Objektverwalter.Spielfeld.Landschaften(AktuellerBefehl.KooX, AktuellerBefehl.KooY, Objektverwalter.Spielfeld.MomentaneSchlacht).Gebaeude, New EinheitAmphibienpanzer(AktuellerBefehl.Spieler, AktuellerBefehl.OpferX, AktuellerBefehl.OpferY), 2)
                        Case KIModiExtern.Schuss
                            GebaeudeAuswaehlen(AktuellerBefehl.Befehl, Objektverwalter.Spielfeld.Landschaften(AktuellerBefehl.KooX, AktuellerBefehl.KooY, Objektverwalter.Spielfeld.MomentaneSchlacht).Gebaeude, New EinheitAmphibienpanzer(AktuellerBefehl.Spieler, AktuellerBefehl.OpferX, AktuellerBefehl.OpferY), 2)
                        Case KIModiExtern.Entladen
                            Einheitauswaehlen(Objektverwalter.Spielfeld.Einheiten(AktuellerBefehl.KooX, AktuellerBefehl.KooY, Objektverwalter.Spielfeld.MomentaneSchlacht), _
                                            AktuellerBefehl.WegX, AktuellerBefehl.WegY, AktuellerBefehl.Befehl, _
                                            New EinheitAmphibienpanzer(AktuellerBefehl.Spieler, AktuellerBefehl.OpferX, AktuellerBefehl.OpferY, True), Nothing, 0)
                        Case KIModiExtern.SiloZuenden
                            Einheitauswaehlen(Objektverwalter.Spielfeld.Einheiten(AktuellerBefehl.KooX, AktuellerBefehl.KooY, Objektverwalter.Spielfeld.MomentaneSchlacht), _
                                            AktuellerBefehl.WegX, AktuellerBefehl.WegY, AktuellerBefehl.Befehl, _
                                            New EinheitAmphibienpanzer(AktuellerBefehl.Spieler, AktuellerBefehl.OpferX, AktuellerBefehl.OpferY, True), Nothing, 0)
                        Case KIModiExtern.GebaeudeBauen
                            Einheitauswaehlen(Objektverwalter.Spielfeld.Einheiten(AktuellerBefehl.KooX, AktuellerBefehl.KooY, Objektverwalter.Spielfeld.MomentaneSchlacht), _
                                            AktuellerBefehl.WegX, AktuellerBefehl.WegY, AktuellerBefehl.Befehl, _
                                            New EinheitAmphibienpanzer(AktuellerBefehl.Spieler, AktuellerBefehl.OpferX, AktuellerBefehl.OpferY, True), Nothing, 0)
                        Case KIModiExtern.FlugzeugtraegerBau
                            Einheitauswaehlen(Objektverwalter.Spielfeld.Einheiten(AktuellerBefehl.KooX, AktuellerBefehl.KooY, Objektverwalter.Spielfeld.MomentaneSchlacht), _
                                            AktuellerBefehl.WegX, AktuellerBefehl.WegY, AktuellerBefehl.Befehl, _
                                             GenereateUnit(AktuellerBefehl.OpferX, AktuellerBefehl.OpferY, AktuellerBefehl.AngreiferSchaden, AktuellerBefehl.Spieler, AktuellerBefehl.Verteidigerschaden), Nothing, 0)
                        Case KIModiExtern.Angriff
                            If Objektverwalter.Spielfeld.Einheiten(AktuellerBefehl.OpferX, AktuellerBefehl.OpferY, Objektverwalter.Spielfeld.MomentaneSchlacht) Is Nothing Then
                                Einheitauswaehlen(Objektverwalter.Spielfeld.Einheiten(AktuellerBefehl.KooX, AktuellerBefehl.KooY, Objektverwalter.Spielfeld.MomentaneSchlacht), _
                                            AktuellerBefehl.WegX, AktuellerBefehl.WegY, AktuellerBefehl.Befehl, _
                                            New EinheitAmphibienpanzer(0, AktuellerBefehl.OpferX, AktuellerBefehl.OpferY), Nothing, 0)

                            Else
                                Einheitauswaehlen(Objektverwalter.Spielfeld.Einheiten(AktuellerBefehl.KooX, AktuellerBefehl.KooY, Objektverwalter.Spielfeld.MomentaneSchlacht), _
                                            AktuellerBefehl.WegX, AktuellerBefehl.WegY, AktuellerBefehl.Befehl, _
                                            Objektverwalter.Spielfeld.Einheiten(AktuellerBefehl.OpferX, AktuellerBefehl.OpferY, Objektverwalter.Spielfeld.MomentaneSchlacht), Nothing, 0)

                            End If
                        Case KIModiExtern.InstantBattle
                            Objektverwalter.Angriff(Objektverwalter.Spielfeld.Einheiten(AktuellerBefehl.KooX, AktuellerBefehl.KooY, Objektverwalter.Spielfeld.MomentaneSchlacht), AktuellerBefehl.OpferX, AktuellerBefehl.OpferY, AngreiferSchaden, VerteidigerSchaden, True)
                        Case KIModiExtern.Leuchtrakete
                            Einheitauswaehlen(Objektverwalter.Spielfeld.Einheiten(AktuellerBefehl.KooX, AktuellerBefehl.KooY, Objektverwalter.Spielfeld.MomentaneSchlacht), _
                                            AktuellerBefehl.WegX, AktuellerBefehl.WegY, AktuellerBefehl.Befehl, _
                                            New EinheitAmphibienpanzer(0, AktuellerBefehl.OpferX, AktuellerBefehl.OpferY), Nothing, 0)
                        Case KIModiExtern.WetterWechsel
                            Objektverwalter.Spielfeld.Regeln.Wetter = AktuellerBefehl.KooX
                        Case KIModiExtern.WolkeBewegen
                            Objektverwalter.Spielfeld.WolkenBewegen(AktuellerBefehl.KooX, AktuellerBefehl.KooY, AktuellerBefehl.OpferX, AktuellerBefehl.OpferY)
                        Case KIModiExtern.EinheitVerbessern
                            Dim Einheit As ObjektEinheit = Objektverwalter.Spielfeld.Einheiten(AktuellerBefehl.KooX, AktuellerBefehl.KooY, AktuellerBefehl.OpferX)
                            If Not Einheit Is Nothing Then 'Sollte immer etwas sein.
                                Einheit.ATKDEFBoost.X += AktuellerBefehl.OpferY
                                Einheit.Bewegungsbonus += AktuellerBefehl.AngreiferSchaden
                            End If
                        Case KIModiExtern.EinheitTreibstoffSetzen
                            Dim Einheit As ObjektEinheit = Objektverwalter.Spielfeld.Einheiten(AktuellerBefehl.KooX, AktuellerBefehl.KooY, AktuellerBefehl.OpferX)
                            If Not Einheit Is Nothing Then
                                'Treibstoff festsetzen
                                Einheit.Sprit = AktuellerBefehl.OpferY
                            End If
                        Case KIModiExtern.VulkanFeuer
                            Dim Vulkan As GebaeudeVulkan = Objektverwalter.Spielfeld.Landschaften(AktuellerBefehl.KooX, AktuellerBefehl.KooY, ObjektSpielfeld.Bodenschlacht).Gebaeude
                            Dim Ziele(AktuellerBefehl.WegX.Length - 1) As Point
                            For I = 0 To AktuellerBefehl.WegX.Length - 1
                                Ziele(I) = New Point(AktuellerBefehl.WegX(I), AktuellerBefehl.WegY(I))
                            Next
                            Vulkan.Feuer(Ziele)
                        Case KIModiExtern.ShockUnit 'shocks a Unit
                            If Objektverwalter.Spielfeld.Einheiten(AktuellerBefehl.KooX, AktuellerBefehl.KooY, Objektverwalter.Spielfeld.MomentaneSchlacht) IsNot Nothing Then
                                Objektverwalter.Spielfeld.Einheiten(AktuellerBefehl.KooX, AktuellerBefehl.KooY, Objektverwalter.Spielfeld.MomentaneSchlacht).HatsichBewegt = True
                            End If
                        Case KIModiExtern.PlaceBuilding 'places a Special Building
                            Dim G As ObjektGebaeude = ObjektLadeklasse.NewGebaeude(ObjektLadeklasse.GetGebaeudeStringID(AngreiferSchaden), Spieler.Spieler, -1, -1, False)
                            Objektverwalter.Spielfeld.PlaceBuilding(G, AktuellerBefehl.KooX, AktuellerBefehl.KooY, ObjektSpielfeld.Bodenschlacht)
                        Case KIModiExtern.GetEnemyBuilding 'Gets us a new Building
                            Objektverwalter.Spielfeld.Spieler(AktuellerBefehl.Spieler).KOS(0).GebaeudeUebernehmen(AktuellerBefehl.KooX, AktuellerBefehl.KooY)
                        Case KIModiExtern.LaunchRocket
                            Dim Anim As ObjektKO.RocketAnimations = AktuellerBefehl.OpferX
                            ObjektKO.Rakete(New Point(AktuellerBefehl.KooX, AktuellerBefehl.KooY), Anim.ToString.ToUpper, AktuellerBefehl.Verteidigerschaden, AktuellerBefehl.AngreiferSchaden)
                        Case KIModiExtern.InvasionUnit
                            If AktuellerBefehl.OpferX >= 0 And AktuellerBefehl.OpferX < Objektverwalter.AlleEinheiten.Length Then
                                Objektverwalter.Spielfeld.Spieler(AktuellerBefehl.Spieler).KOS(0).Invasion(Objektverwalter.AlleEinheiten(AktuellerBefehl.OpferX).EinheitenID, AktuellerBefehl.KooX, AktuellerBefehl.KooY)
                            End If
                        Case Else
                            Einheitauswaehlen(Objektverwalter.Spielfeld.Einheiten(AktuellerBefehl.KooX, AktuellerBefehl.KooY, Objektverwalter.Spielfeld.MomentaneSchlacht), _
                                             AktuellerBefehl.WegX, AktuellerBefehl.WegY, AktuellerBefehl.Befehl, _
                                             Objektverwalter.Spielfeld.Einheiten(AktuellerBefehl.OpferX, AktuellerBefehl.OpferY, Objektverwalter.Spielfeld.MomentaneSchlacht), Nothing, 0)
                    End Select
                End If
                BefehleLocker.Lock()
                Befehle.RemoveAt(0)
                BefehleLocker.Unlock()
                DoesOrder = False
            Else
                Threading.Thread.Sleep(ThreadSleepTime)
            End If

        End While

    End Sub
    Public Sub DoOrder(ByVal AktuellerBefehl As KINetzwerkBefehl)
        AngreiferSchaden = AktuellerBefehl.AngreiferSchaden
        VerteidigerSchaden = AktuellerBefehl.Verteidigerschaden
        'hier sollten wir auswaehlen und zwar Gabe,Gebaeudebefehle,Beenden werden nicht ausgefuehrt
        Select Case AktuellerBefehl.Befehl
            Case KIModiExtern.Schlachtwechseln
                Objektverwalter.Spielfeld.SchlachtWechseln()
            Case KIModiExtern.GabeEinsetzen
                Objektverwalter.Spielfeld.AktuellerSpieler.KOS(0).Gabe()
            Case KIModiExtern.SpezialgabeEinsetzen
                Objektverwalter.Spielfeld.AktuellerSpieler.KOS(0).Spezialgabe()
            Case KIModiExtern.DoppelGabeEinsetzen
                Objektverwalter.Spielfeld.AktuellerSpieler.KOS(0).Doppelgabe()
            Case KIModiExtern.RundenEnde
                Objektverwalter.Spielfeld.RundenEnde()
                Objektverwalter.Spielfeld.RundenAnfang()
                Objektverwalter.Spielfeld.CurrentAI.KIThreat.Abort()
                Objektverwalter.Spielfeld.CurrentAI.KIThreat = Nothing
            Case KIModiExtern.Wechsel
                Objektverwalter.Spielfeld.AktuellerSpieler.Wechsel()
                Objektverwalter.Spielfeld.RundenAnfang()
                Objektverwalter.Spielfeld.CurrentAI.KIThreat.Abort()
                Objektverwalter.Spielfeld.CurrentAI.KIThreat = Nothing
            Case KIModiExtern.EinheitBauen
                GebaeudeAuswaehlen(AktuellerBefehl.Befehl, Objektverwalter.Spielfeld.Landschaften(AktuellerBefehl.KooX, AktuellerBefehl.KooY, Objektverwalter.Spielfeld.MomentaneSchlacht).Gebaeude, _
                                 GenereateUnit(AktuellerBefehl.OpferX, AktuellerBefehl.OpferY, AktuellerBefehl.WegX(0), AktuellerBefehl.Spieler, AktuellerBefehl.WegY(0)), 0, False)
            Case KIModiExtern.FabrikBauen
                GebaeudeAuswaehlen(AktuellerBefehl.Befehl, Objektverwalter.Spielfeld.Landschaften(AktuellerBefehl.KooX, AktuellerBefehl.KooY, Objektverwalter.Spielfeld.MomentaneSchlacht).Gebaeude, _
                                GenereateUnit(AktuellerBefehl.OpferX, AktuellerBefehl.OpferY, AktuellerBefehl.WegX(0), AktuellerBefehl.Spieler, AktuellerBefehl.WegY(0)), 0, False)
            Case KIModiExtern.OmegaRaketeStarten
                GebaeudeAuswaehlen(AktuellerBefehl.Befehl, Objektverwalter.Spielfeld.Landschaften(AktuellerBefehl.KooX, AktuellerBefehl.KooY, Objektverwalter.Spielfeld.MomentaneSchlacht).Gebaeude, New EinheitAmphibienpanzer(AktuellerBefehl.Spieler, AktuellerBefehl.OpferX, AktuellerBefehl.OpferY), 2, False)
            Case KIModiExtern.OmegaUpgradeKaufen
                GebaeudeAuswaehlen(AktuellerBefehl.Befehl, Objektverwalter.Spielfeld.Landschaften(AktuellerBefehl.KooX, AktuellerBefehl.KooY, Objektverwalter.Spielfeld.MomentaneSchlacht).Gebaeude, New EinheitAmphibienpanzer(AktuellerBefehl.Spieler, AktuellerBefehl.OpferX, AktuellerBefehl.OpferY), 2, False)
            Case KIModiExtern.Schuss
                GebaeudeAuswaehlen(AktuellerBefehl.Befehl, Objektverwalter.Spielfeld.Landschaften(AktuellerBefehl.KooX, AktuellerBefehl.KooY, Objektverwalter.Spielfeld.MomentaneSchlacht).Gebaeude, New EinheitAmphibienpanzer(AktuellerBefehl.Spieler, AktuellerBefehl.OpferX, AktuellerBefehl.OpferY), 2, False)
            Case KIModiExtern.Entladen
                Einheitauswaehlen(Objektverwalter.Spielfeld.Einheiten(AktuellerBefehl.KooX, AktuellerBefehl.KooY, Objektverwalter.Spielfeld.MomentaneSchlacht), _
                                AktuellerBefehl.WegX, AktuellerBefehl.WegY, AktuellerBefehl.Befehl, _
                                New EinheitAmphibienpanzer(AktuellerBefehl.Spieler, AktuellerBefehl.OpferX, AktuellerBefehl.OpferY, True), Nothing, 0, False)
            Case KIModiExtern.SiloZuenden
                Einheitauswaehlen(Objektverwalter.Spielfeld.Einheiten(AktuellerBefehl.KooX, AktuellerBefehl.KooY, Objektverwalter.Spielfeld.MomentaneSchlacht), _
                                AktuellerBefehl.WegX, AktuellerBefehl.WegY, AktuellerBefehl.Befehl, _
                                New EinheitAmphibienpanzer(AktuellerBefehl.Spieler, AktuellerBefehl.OpferX, AktuellerBefehl.OpferY, True), Nothing, 0, False)
            Case KIModiExtern.GebaeudeBauen
                Einheitauswaehlen(Objektverwalter.Spielfeld.Einheiten(AktuellerBefehl.KooX, AktuellerBefehl.KooY, Objektverwalter.Spielfeld.MomentaneSchlacht), _
                                AktuellerBefehl.WegX, AktuellerBefehl.WegY, AktuellerBefehl.Befehl, _
                                New EinheitAmphibienpanzer(AktuellerBefehl.Spieler, AktuellerBefehl.OpferX, AktuellerBefehl.OpferY, True), Nothing, 0, False)
            Case KIModiExtern.FlugzeugtraegerBau
                Einheitauswaehlen(Objektverwalter.Spielfeld.Einheiten(AktuellerBefehl.KooX, AktuellerBefehl.KooY, Objektverwalter.Spielfeld.MomentaneSchlacht), _
                                AktuellerBefehl.WegX, AktuellerBefehl.WegY, AktuellerBefehl.Befehl, _
                                 GenereateUnit(AktuellerBefehl.OpferX, AktuellerBefehl.OpferY, AktuellerBefehl.AngreiferSchaden, AktuellerBefehl.Spieler, AktuellerBefehl.Verteidigerschaden), Nothing, 0, False)
            Case KIModiExtern.Angriff
                If Objektverwalter.Spielfeld.Einheiten(AktuellerBefehl.OpferX, AktuellerBefehl.OpferY, Objektverwalter.Spielfeld.MomentaneSchlacht) Is Nothing Then
                    Einheitauswaehlen(Objektverwalter.Spielfeld.Einheiten(AktuellerBefehl.KooX, AktuellerBefehl.KooY, Objektverwalter.Spielfeld.MomentaneSchlacht), _
                                AktuellerBefehl.WegX, AktuellerBefehl.WegY, AktuellerBefehl.Befehl, _
                                New EinheitAmphibienpanzer(0, AktuellerBefehl.OpferX, AktuellerBefehl.OpferY), Nothing, 0, False)

                Else
                    Einheitauswaehlen(Objektverwalter.Spielfeld.Einheiten(AktuellerBefehl.KooX, AktuellerBefehl.KooY, Objektverwalter.Spielfeld.MomentaneSchlacht), _
                                AktuellerBefehl.WegX, AktuellerBefehl.WegY, AktuellerBefehl.Befehl, _
                                Objektverwalter.Spielfeld.Einheiten(AktuellerBefehl.OpferX, AktuellerBefehl.OpferY, Objektverwalter.Spielfeld.MomentaneSchlacht), Nothing, 0, False)

                End If
            Case KIModiExtern.Leuchtrakete
                Einheitauswaehlen(Objektverwalter.Spielfeld.Einheiten(AktuellerBefehl.KooX, AktuellerBefehl.KooY, Objektverwalter.Spielfeld.MomentaneSchlacht), _
                                AktuellerBefehl.WegX, AktuellerBefehl.WegY, AktuellerBefehl.Befehl, _
                                New EinheitAmphibienpanzer(0, AktuellerBefehl.OpferX, AktuellerBefehl.OpferY), Nothing, 0, False)
            Case KIModiExtern.WetterWechsel
                Objektverwalter.Spielfeld.Regeln.Wetter = AktuellerBefehl.KooX
            Case KIModiExtern.WolkeBewegen
                Objektverwalter.Spielfeld.WolkenBewegen(AktuellerBefehl.KooX, AktuellerBefehl.KooY, AktuellerBefehl.OpferX, AktuellerBefehl.OpferY)
            Case KIModiExtern.EinheitVerbessern
                Dim Einheit As ObjektEinheit = Objektverwalter.Spielfeld.Einheiten(AktuellerBefehl.KooX, AktuellerBefehl.KooY, AktuellerBefehl.OpferX)
                If Not Einheit Is Nothing Then 'Sollte immer etwas sein.
                    Einheit.ATKDEFBoost.X += AktuellerBefehl.OpferY
                    Einheit.Bewegungsbonus += AktuellerBefehl.AngreiferSchaden
                End If
            Case KIModiExtern.EinheitTreibstoffSetzen
                Dim Einheit As ObjektEinheit = Objektverwalter.Spielfeld.Einheiten(AktuellerBefehl.KooX, AktuellerBefehl.KooY, AktuellerBefehl.OpferX)
                If Not Einheit Is Nothing Then
                    'Treibstoff festsetzen
                    Einheit.Sprit = AktuellerBefehl.OpferY
                End If
            Case KIModiExtern.VulkanFeuer
                Dim Vulkan As GebaeudeVulkan = Objektverwalter.Spielfeld.Landschaften(AktuellerBefehl.KooX, AktuellerBefehl.KooY, ObjektSpielfeld.Bodenschlacht).Gebaeude
                Dim Ziele(AktuellerBefehl.WegX.Length - 1) As Point
                For I = 0 To AktuellerBefehl.WegX.Length - 1
                    Ziele(I) = New Point(AktuellerBefehl.WegX(I), AktuellerBefehl.WegY(I))
                Next
                Vulkan.Feuer(Ziele)
            Case KIModiExtern.ShockUnit 'shocks a Unit
                If Objektverwalter.Spielfeld.Einheiten(AktuellerBefehl.KooX, AktuellerBefehl.KooY, Objektverwalter.Spielfeld.MomentaneSchlacht) IsNot Nothing Then
                    Objektverwalter.Spielfeld.Einheiten(AktuellerBefehl.KooX, AktuellerBefehl.KooY, Objektverwalter.Spielfeld.MomentaneSchlacht).HatsichBewegt = True
                End If
            Case KIModiExtern.PlaceBuilding 'places a Special Building
                Dim G As ObjektGebaeude = ObjektLadeklasse.NewGebaeude(ObjektLadeklasse.GetGebaeudeStringID(AngreiferSchaden), Spieler.Spieler, -1, -1, False)
                Objektverwalter.Spielfeld.PlaceBuilding(G, AktuellerBefehl.KooX, AktuellerBefehl.KooY, ObjektSpielfeld.Bodenschlacht)
            Case KIModiExtern.GetEnemyBuilding 'Gets us a new Building
                Objektverwalter.Spielfeld.Spieler(AktuellerBefehl.Spieler).KOS(0).GebaeudeUebernehmen(AktuellerBefehl.KooX, AktuellerBefehl.KooY)
            Case KIModiExtern.LaunchRocket
                Dim Anim As ObjektKO.RocketAnimations = AktuellerBefehl.OpferX
                ObjektKO.Rakete(New Point(AktuellerBefehl.KooX, AktuellerBefehl.KooY), Anim.ToString.ToUpper, AktuellerBefehl.Verteidigerschaden, AktuellerBefehl.AngreiferSchaden)
            Case KIModiExtern.InvasionUnit
                If AktuellerBefehl.OpferX >= 0 And AktuellerBefehl.OpferX < Objektverwalter.AlleEinheiten.Length Then
                    Objektverwalter.Spielfeld.Spieler(AktuellerBefehl.Spieler).KOS(0).Invasion(Objektverwalter.AlleEinheiten(AktuellerBefehl.OpferX).EinheitenID, AktuellerBefehl.KooX, AktuellerBefehl.KooY)
                End If
            Case Else
                Einheitauswaehlen(Objektverwalter.Spielfeld.Einheiten(AktuellerBefehl.KooX, AktuellerBefehl.KooY, Objektverwalter.Spielfeld.MomentaneSchlacht), _
                                 AktuellerBefehl.WegX, AktuellerBefehl.WegY, AktuellerBefehl.Befehl, _
                                 Objektverwalter.Spielfeld.Einheiten(AktuellerBefehl.OpferX, AktuellerBefehl.OpferY, Objektverwalter.Spielfeld.MomentaneSchlacht), Nothing, 0, False)
        End Select
    End Sub

    Public Sub AddBefehl(ByVal NeuBefehl As KINetzwerkBefehl)
        BefehleLocker.Lock()
        Befehle.Add(NeuBefehl)
        BefehleLocker.Unlock()
    End Sub

    Public Function GenereateUnit(ByVal X As Integer, ByVal Y As Integer, ByVal EinheitenID As Integer, ByVal Spieler As Integer, ByVal HatSichBewegt As Boolean) As ObjektEinheit
        Return ObjektLadeklasse.NewEinheit(Objektverwalter.AlleEinheiten(EinheitenID).EinheitenID, Spieler, X, Y, HatSichBewegt)
    End Function

    Protected Overrides Function CalculateRealZiel(ByRef WSS As Wegsuchsystem, ByVal Ziel As System.Drawing.Point, ByVal Einheit As ObjektEinheit, ByRef Opfer As System.Drawing.Point) As System.Drawing.Point
        Return Ziel
    End Function

    Public Shared Sub sInfoOrder(ByVal sInfo() As String)
        'It's a Script Event yeah
        Select Case sInfo(1).ToLower
            Case "ScriptUpdate"
                ObjektScript.ScriptUpdateDone = True
            Case "UnhideArea".ToLower
                Dim X1 As Integer = CInt(sInfo(2))
                Dim Y1 As Integer = CInt(sInfo(3))
                Dim X2 As Integer = CInt(sInfo(4))
                Dim Y2 As Integer = CInt(sInfo(5))
                Dim Hide As Boolean = CBool(sInfo(6))
                For X = X1 To X2
                    For Y = Y1 To Y2
                        If Objektverwalter.Spielfeld.OnMap(X, Y, True) Then
                            Objektverwalter.Spielfeld.Landschaften(X, Y, 0).Hidden = Hide
                            Objektverwalter.Spielfeld.Landschaften(X, Y, 1).Hidden = Hide
                        End If
                    Next
                Next
            Case "CreateFog".ToLower
                Dim Left As Integer = CInt(sInfo(2))
                Dim Top As Integer = CInt(sInfo(3))
                Dim Right As Integer = CInt(sInfo(4))
                Dim Bottom As Integer = CInt(sInfo(5))
                Dim Nebel As Nebelarten = CInt(sInfo(6))
                Dim Spieler As Integer = CInt(sInfo(7))
                If Objektverwalter.Spielfeld.Regeln.NebelFelder Is Nothing Then
                    Objektverwalter.Spielfeld.Regeln.NebelFelder = New List(Of ObjektRegeln.Nebelfeld)
                End If
                For X = Left To Right
                    For Y = Top To Bottom
                        Objektverwalter.Spielfeld.Regeln.NebelFelder.Add(New ObjektRegeln.Nebelfeld(X, Y, Nebel, True, Spieler))
                    Next
                Next
                Objektverwalter.Spielfeld.Sichterstellen(False)
            Case "DefeatPlayer".ToLower
                Dim Spieler As Integer = CInt(sInfo(2))
                If Spieler < Objektverwalter.Spielfeld.Regeln.Besiegt.Length And Spieler > 0 Then
                    Objektverwalter.Spielfeld.Regeln.Besiegt(Spieler) = True
                End If
                Objektverwalter.Spielfeld.Regeln.CheckSieg()
            Case "AddWaitUnit".ToLower
                Dim X As Integer = CInt(sInfo(2))
                Dim Y As Integer = CInt(sInfo(3))
                Dim Schlacht As Integer = CInt(sInfo(4))
                Dim Spieler As Integer = CInt(sInfo(5))
                If Objektverwalter.Spielfeld.OnMap(X, Y) Then
                    If Schlacht = 0 Or Schlacht = 1 Then
                        Dim E As ObjektEinheit = Objektverwalter.Spielfeld.Einheiten(X, Y, Schlacht)
                        If Not E Is Nothing Then
                            If Spieler < Objektverwalter.Spielfeld.Spieler.Length Then
                                Objektverwalter.Spielfeld.Spieler(E.Spieler).AddExternGezogeneEinheit(0, 0, E, ObjektSpieler.ExternGezogeneEinheit.Befehle.WartenBisAngriff, "", ObjektSpieler.ExternGezogeneEinheit.NaechsteBefehle.Entfernen)
                            End If
                        End If
                    End If
                End If
            Case "SetFireCounter".ToLower
                Dim X As Integer = CInt(sInfo(2))
                Dim Y As Integer = CInt(sInfo(3))
                Dim Schlacht As Integer = CInt(sInfo(4))
                Dim Feuerladung As Integer = CInt(sInfo(5))
                Dim G As ObjektGebaeude = Objektverwalter.Spielfeld.Landschaften(X, Y, Schlacht).Gebaeude
                If Not G Is Nothing Then
                    G = Objektverwalter.Spielfeld.Landschaften(G.Rechteck.X, G.Rechteck.Y, Schlacht).Gebaeude
                    G.SetFeuerbereit(Feuerladung)
                End If
            Case "DamageWave".ToLower
                Dim Spieler As Integer = CInt(sInfo(2))
                Dim Wirkung As Integer = CInt(sInfo(3))
                ObjektScript.EreignisSchadenswelle.Schadenswelle(Objektverwalter.Spielfeld.Spieler(Spieler).Team, Wirkung)
            Case "Victory".ToLower
                Dim Team As Char = "A"
                If IsNumeric(sInfo(2)) Then
                    Dim I As Integer = CInt(sInfo(2))
                    If I > 0 And I < Objektverwalter.Spielfeld.Spieler.Length Then
                        Team = Objektverwalter.Spielfeld.Spieler(I).Team
                    End If
                Else
                    Team = CChar(sInfo(2))
                End If

                For I = 0 To Objektverwalter.Spielfeld.Regeln.Besiegt.Length - 1
                    If Objektverwalter.Spielfeld.Spieler(I).Team <> Team Then
                        Objektverwalter.Spielfeld.Regeln.Besiegt(I) = True
                    Else
                        Objektverwalter.Spielfeld.Regeln.Besiegt(I) = False
                    End If
                Next
                Objektverwalter.Spielfeld.Regeln.CheckSieg()
            Case "SetCO".ToLower
                Dim Spieler As Integer = CInt(sInfo(2))
                Dim KOIndex As Integer = CInt(sInfo(3))
                Dim KOID As String = sInfo(4)
                If KOIndex < 0 Then KOIndex = 0
                If KOIndex > 1 Then KOIndex = 1
                If KOID = "-" Then
                    If KOIndex = 1 Then Objektverwalter.Spielfeld.Spieler(Spieler).KOS(KOIndex) = Nothing
                Else
                    Objektverwalter.Spielfeld.Spieler(Spieler).KOS(KOIndex) = ObjektLadeklasse.NewKO(KOID, Spieler)
                End If
            Case "SetHP".ToLower
                Dim KooX As Integer = CInt(sInfo(2))
                Dim KooY As Integer = CInt(sInfo(3))
                Dim Schlachtfeld As Integer = CInt(sInfo(4))
                Dim KP As Integer = CInt(sInfo(5))
                If Not IsNothing(Objektverwalter.Spielfeld.Einheiten(KooX, KooY, Schlachtfeld)) Then  'Nur zur sicherheit, wenn man sich mit einem Script auf eine Position bezieht, kann man sich natuerlich sicher sein, dass dort jemand ist, muss es aber nicht.
                    Objektverwalter.Spielfeld.Einheiten(KooX, KooY, Schlachtfeld).SetKP(KP)
                ElseIf Objektverwalter.Spielfeld.Landschaften(KooX, KooY, Schlachtfeld).Leben > 0 Then
                    Objektverwalter.Spielfeld.Landschaften(KooX, KooY, Schlachtfeld).SetLeben(KP)
                Else
                    Dim G As ObjektGebaeude = Objektverwalter.Spielfeld.Landschaften(KooX, KooY, Schlachtfeld).Gebaeude
                    If Not G Is Nothing Then
                        If G.GetKP(KooX, KooY, True) > 0 Then
                            G.KP = KP
                        End If
                    End If
                End If
            Case "CreateUnit".ToLower
                Dim KooX As Integer = CInt(sInfo(2))
                Dim KooY As Integer = CInt(sInfo(3))
                Dim Schlacht As Integer = CInt(sInfo(4))
                Dim Spieler As Integer = CInt(sInfo(5))
                Dim Leben As Integer = CInt(sInfo(6))
                Dim EinheitsID As String = sInfo(7)
                Dim kannZiehen As Boolean = CBool(sInfo(2))
                If Schlacht = -1 Then Schlacht = Objektverwalter.Spielfeld.MomentaneSchlacht
                Objektverwalter.Spielfeld.PlaceUnit(ObjektLadeklasse.NewEinheit(EinheitsID, Spieler, KooX, KooY, Leben, Not kannZiehen), KooX, KooY, Schlacht)
            Case "CreateCOClone".ToLower
                Dim Spieler As Integer = CInt(sInfo(2))
                Dim KONumber As Integer = CInt(sInfo(3))
                Dim KOID As String = sInfo(4)
                Dim KOBild As String = sInfo(5)
                If KONumber > 1 Or KONumber < 0 Then
                    KONumber = 0
                End If
                If Spieler > 0 And Spieler < Objektverwalter.Spielfeld.Spieler.Length Then
                    Dim ID As Integer = 0
                    For I = 0 To Objektverwalter.GetKOLength() - 1
                        If Objektverwalter.GetKO(I).KOID.ToLower = KOID.ToLower Then
                            ID = I
                            Exit For
                        End If
                    Next
                    Objektverwalter.Spielfeld.Spieler(Spieler).KOS(KONumber) = New KOClone(Spieler, ID, KOBild)
                End If
            Case "Dialog".ToLower
                Dim Text As String = sInfo(2)
                Dim KOID As String = sInfo(3)
                Dim Musik As String = sInfo(4)
                Dim Bild As String = sInfo(5)
                Dim Gesichtsausdruck As ObjektKOTextZeile.KOGesichtsAusdruck = CInt(sInfo(6))
                Dim Spieler As Integer = CInt(sInfo(7))
                If KOID.ToLower = "spieler".ToLower Then 'Der Aktuelle erste KO des Spielers soll sprechen.
                    ObjektKODialog.NeuerDialog(New ObjektKODialog.KOText() {New ObjektKODialog.KOText(Objektverwalter.Spielfeld.Spieler(Spieler).KOS(0).KOID, Text, Spieler, Gesichtsausdruck, , Musik, Bild)}) 'Objektverwalter.Spielfeld.AktuellerSpieler.KOS(0).KOID, "Puh, ist das heiss hier!", Objektverwalter.Spielfeld.AktuellerSpieler.Spieler, ObjektKOTextZeile.KOGesichtsAusdruck.Traurig)})
                Else 'Ein vordefinierter KO soll sprechen.
                    ObjektKODialog.NeuerDialog(New ObjektKODialog.KOText() {New ObjektKODialog.KOText(KOID, Text, Spieler, Gesichtsausdruck, , Musik, Bild)}) 'Objektverwalter.Spielfeld.AktuellerSpieler.KOS(0).KOID, "Puh, ist das heiss hier!", Objektverwalter.Spielfeld.AktuellerSpieler.Spieler, ObjektKOTextZeile.KOGesichtsAusdruck.Traurig)})
                End If
            Case "ChangeCOPowerstate"
                Dim Spieler As Integer = CInt(sInfo(2))
                Dim PowerState As Boolean = CBool(sInfo(3))
                If Spieler > 0 And Spieler < Objektverwalter.Spielfeld.Spieler.Length Then
                    Objektverwalter.Spielfeld.Spieler(Spieler).Gabeleiste = PowerState
                End If
            Case "WinWorldmapMap".ToLower
                Dim Ind As Integer = CInt(sInfo(2))
                If Objektverwalter.Spielfeld.ObjektLandkartenInfo IsNot Nothing Then
                    If Ind >= 0 And Ind < Objektverwalter.Spielfeld.ObjektLandkartenInfo.Missionen.Length Then
                        Objektverwalter.Spielfeld.ObjektLandkartenInfo.Missionen(Ind).ZustandGewonnen()
                    End If
                End If
            Case "SelectableWorldmapMap".ToLower
                Dim Ind As Integer = CInt(sInfo(2))
                If Objektverwalter.Spielfeld.ObjektLandkartenInfo IsNot Nothing Then
                    If Ind >= 0 And Ind < Objektverwalter.Spielfeld.ObjektLandkartenInfo.Missionen.Length Then
                        Objektverwalter.Spielfeld.ObjektLandkartenInfo.Missionen(Ind).ZustandAuswaehlbar()
                    End If
                End If
            Case "RemoveLockedUnit".ToLower
                Dim EinheitenID As String = sInfo(2)
                Dim Armee As String = sInfo(3)
                If Objektverwalter.Spielfeld.ObjektLandkartenInfo IsNot Nothing Then
                    Objektverwalter.Spielfeld.ObjektLandkartenInfo.RemoveBlockierteEinheit(EinheitenID, Armee)
                End If
            Case "SetWorldmapMap".ToLower
                Dim Ind As Integer = CInt(sInfo(2))
                Dim Zustand As Integer = CInt(sInfo(2))
                If Objektverwalter.Spielfeld.ObjektLandkartenInfo IsNot Nothing Then
                    If Ind >= 0 And Ind < Objektverwalter.Spielfeld.ObjektLandkartenInfo.Missionen.Length Then
                        Objektverwalter.Spielfeld.ObjektLandkartenInfo.Missionen(Ind).MissionsZustand = Zustand
                    End If
                End If
        End Select
    End Sub
End Class

Public Class KINetzwerkBefehl
    Public Sub New()
    End Sub
    Public Sub New(ByVal sinfo() As String)
        Me.sinfo = sinfo
        Me.sinfoOrder = True
    End Sub
    Public Sub New(ByVal Befehl As ObjektKI.KIModiExtern, ByVal KooX As Integer, ByVal KooY As Integer, ByVal WegX() As Integer, ByVal WegY() As Integer, ByVal OpferX As Integer, ByVal OpferY As Integer, ByVal AngreiferSchaden As Single, ByVal Verteidigerschaden As Single, ByVal Spieler As Integer)
        Me.Befehl = Befehl
        Me.KooX = KooX
        Me.KooY = KooY
        Me.WegX = WegX
        Me.WegY = WegY
        Me.OpferX = OpferX
        Me.OpferY = OpferY
        Me.AngreiferSchaden = AngreiferSchaden
        Me.Verteidigerschaden = Verteidigerschaden
        Me.Spieler = Spieler
        Me.sinfoOrder = False
    End Sub
    Public Befehl As ObjektKI.KIModiExtern
    Public KooX As Integer
    Public KooY As Integer
    Public WegX() As Integer
    Public WegY() As Integer
    Public OpferX As Integer
    Public OpferY As Integer
    Public AngreiferSchaden As Single
    Public Verteidigerschaden As Single
    Public Spieler As Integer
    Public sinfo() As String
    Public sinfoOrder As Boolean
End Class
